From 6578c9d876b6a40003696f773acd801fbfa73921 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 13 Feb 2014 00:14:42 -0500 Subject: [PATCH] Modernize the app chooser dialog This is according to suggestions in https://bugzilla.gnome.org/show_bug.cgi?id=724218 --- gtk/gtkappchooserdialog.c | 119 ++++++++++---------- gtk/gtkappchooserwidget.c | 29 +++-- gtk/resources/ui/gtkappchooserdialog.ui | 19 ++-- gtk/resources/ui/gtkappchooserdialog.ui.h | 3 +- gtk/resources/ui/gtkappchooserwidget.ui | 125 ++++++++++++++-------- gtk/resources/ui/gtkappchooserwidget.ui.h | 1 + 6 files changed, 170 insertions(+), 126 deletions(-) diff --git a/gtk/gtkappchooserdialog.c b/gtk/gtkappchooserdialog.c index d100e308b2..57be9cf411 100644 --- a/gtk/gtkappchooserdialog.c +++ b/gtk/gtkappchooserdialog.c @@ -66,13 +66,13 @@ struct _GtkAppChooserDialogPrivate { char *heading; GtkWidget *label; - GtkWidget *software_button; GtkWidget *inner_box; GtkWidget *open_label; GtkWidget *app_chooser_widget; GtkWidget *show_more_button; + GtkWidget *software_button; gboolean show_more_clicked; gboolean dismissed; @@ -165,18 +165,18 @@ get_extension (const char *basename) static void set_dialog_properties (GtkAppChooserDialog *self) { - gchar *label; gchar *name; gchar *extension; gchar *description; - gchar *default_text; gchar *string; gboolean unknown; - PangoFontDescription *font_desc; + gchar *title; + gchar *subtitle; + gboolean use_header; + GtkWidget *header; name = NULL; extension = NULL; - label = NULL; description = NULL; unknown = TRUE; @@ -192,48 +192,54 @@ set_dialog_properties (GtkAppChooserDialog *self) unknown = g_content_type_is_unknown (self->priv->content_type); } - gtk_window_set_title (GTK_WINDOW (self), ""); - if (name != NULL) { + title = g_strdup (_("Select Application")); /* Translators: %s is a filename */ - label = g_strdup_printf (_("Select an application to open “%s”"), name); - string = g_strdup_printf (_("No applications available to open “%s”"), - name); + subtitle = g_strdup_printf (_("Opening “%s”."), name); + string = g_strdup_printf (_("No applications found for “%s”"), name); } else { + title = g_strdup (_("Select Application")); /* Translators: %s is a file type description */ - label = g_strdup_printf (_("Select an application for “%s” files"), - unknown ? self->priv->content_type : description); - string = g_strdup_printf (_("No applications available to open “%s” files"), - unknown ? self->priv->content_type : description); + subtitle = g_strdup_printf (_("Opening “%s” files."), + unknown ? self->priv->content_type : description); + string = g_strdup_printf (_("No applications found for “%s” files"), + unknown ? self->priv->content_type : description); } - font_desc = pango_font_description_new (); - pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); - gtk_widget_override_font (self->priv->label, font_desc); - pango_font_description_free (font_desc); + g_object_get (self, "use-header-bar", &use_header, NULL); + if (use_header) + { + header = gtk_dialog_get_header_bar (GTK_DIALOG (self)); + gtk_header_bar_set_title (GTK_HEADER_BAR (header), title); + gtk_header_bar_set_subtitle (GTK_HEADER_BAR (header), subtitle); + } + else + { + gtk_window_set_title (GTK_WINDOW (self), _("Select Application")); + } if (self->priv->heading != NULL) - gtk_label_set_markup (GTK_LABEL (self->priv->label), self->priv->heading); + { + gtk_label_set_markup (GTK_LABEL (self->priv->label), self->priv->heading); + gtk_widget_show (self->priv->label); + } else - gtk_label_set_markup (GTK_LABEL (self->priv->label), label); - - default_text = g_strdup_printf ("%s\n%s", - string, - _("Click \"Show other applications\", for more options, or " - "\"Software\" to install a new application")); + { + gtk_widget_hide (self->priv->label); + } gtk_app_chooser_widget_set_default_text (GTK_APP_CHOOSER_WIDGET (self->priv->app_chooser_widget), - default_text); + string); - g_free (label); + g_free (title); + g_free (subtitle); g_free (name); g_free (extension); g_free (description); g_free (string); - g_free (default_text); } static void @@ -323,8 +329,7 @@ construct_appchooser_widget (GtkAppChooserDialog *self) GAppInfo *info; /* Need to build the appchooser widget after, because of the content-type construct-only property */ - self->priv->app_chooser_widget = - gtk_app_chooser_widget_new (self->priv->content_type); + self->priv->app_chooser_widget = gtk_app_chooser_widget_new (self->priv->content_type); gtk_box_pack_start (GTK_BOX (self->priv->inner_box), self->priv->app_chooser_widget, TRUE, TRUE, 0); gtk_widget_show (self->priv->app_chooser_widget); @@ -338,8 +343,11 @@ construct_appchooser_widget (GtkAppChooserDialog *self) G_CALLBACK (widget_populate_popup_cb), self); /* Add the custom button to the new appchooser */ - gtk_box_pack_start (GTK_BOX (self->priv->app_chooser_widget), - self->priv->show_more_button, FALSE, FALSE, 6); + gtk_box_pack_start (GTK_BOX (self->priv->inner_box), + self->priv->show_more_button, FALSE, FALSE, 0); + + gtk_box_pack_start (GTK_BOX (self->priv->inner_box), + self->priv->software_button, FALSE, FALSE, 0); info = gtk_app_chooser_get_app_info (GTK_APP_CHOOSER (self->priv->app_chooser_widget)); gtk_dialog_set_response_sensitive (GTK_DIALOG (self), GTK_RESPONSE_OK, info != NULL); @@ -434,34 +442,9 @@ static void ensure_software_button (GtkAppChooserDialog *self) { if (g_find_program_in_path ("gnome-software")) - { - GtkWidget *parent; - gboolean use_header; - - self->priv->software_button = gtk_button_new_with_label (_("Software")); - - gtk_button_set_always_show_image (GTK_BUTTON (self->priv->software_button), TRUE); - gtk_button_set_image (GTK_BUTTON (self->priv->software_button), gtk_image_new_from_icon_name ("gnome-software", GTK_ICON_SIZE_BUTTON)); - gtk_widget_set_valign (self->priv->software_button, GTK_ALIGN_CENTER); - g_signal_connect (self->priv->software_button, "clicked", - G_CALLBACK (software_button_clicked_cb), self); - gtk_widget_show (self->priv->software_button); - - g_object_get (self, "use-header-bar", &use_header, NULL); - if (use_header) - { - parent = gtk_dialog_get_header_bar (GTK_DIALOG (self)); - gtk_header_bar_pack_end (GTK_HEADER_BAR (parent), self->priv->software_button); - } - else - { -G_GNUC_BEGIN_IGNORE_DEPRECATIONS - parent = gtk_dialog_get_action_area (GTK_DIALOG (self)); - gtk_container_add (GTK_CONTAINER (parent), self->priv->software_button); - gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (parent), self->priv->software_button, TRUE); -G_GNUC_END_IGNORE_DEPRECATIONS - } - } + gtk_widget_show (self->priv->software_button); + else + gtk_widget_hide (self->priv->software_button); } static void @@ -611,8 +594,10 @@ gtk_app_chooser_dialog_class_init (GtkAppChooserDialogClass *klass) "/org/gtk/libgtk/ui/gtkappchooserdialog.ui"); gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserDialog, label); gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserDialog, show_more_button); + gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserDialog, software_button); gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserDialog, inner_box); gtk_widget_class_bind_template_callback (widget_class, show_more_button_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, software_button_clicked_cb); } static void @@ -754,8 +739,18 @@ gtk_app_chooser_dialog_set_heading (GtkAppChooserDialog *self, g_free (self->priv->heading); self->priv->heading = g_strdup (heading); - if (self->priv->label && self->priv->heading) - gtk_label_set_markup (GTK_LABEL (self->priv->label), self->priv->heading); + if (self->priv->label) + { + if (self->priv->heading) + { + gtk_label_set_markup (GTK_LABEL (self->priv->label), self->priv->heading); + gtk_widget_show (self->priv->label); + } + else + { + gtk_widget_hide (self->priv->label); + } + } g_object_notify (G_OBJECT (self), "heading"); } diff --git a/gtk/gtkappchooserwidget.c b/gtk/gtkappchooserwidget.c index 213a8b25d6..652f934960 100644 --- a/gtk/gtkappchooserwidget.c +++ b/gtk/gtkappchooserwidget.c @@ -38,6 +38,7 @@ #include "gtktreemodelsort.h" #include "gtkorientable.h" #include "gtkscrolledwindow.h" +#include "gtklabel.h" #include #include @@ -81,6 +82,8 @@ struct _GtkAppChooserWidgetPrivate { GtkWidget *program_list; GtkListStore *program_list_store; + GtkWidget *no_apps_label; + GtkWidget *no_apps; GtkTreeViewColumn *column; GtkCellRenderer *padding_renderer; @@ -438,7 +441,7 @@ gtk_app_chooser_sort_func (GtkTreeModel *model, goto out; } - /* they're both recommended/falback or not, so if one is a heading, wins */ + /* they're both recommended/fallback or not, so if one is a heading, wins */ if (a_heading) { retval = -1; @@ -660,15 +663,13 @@ add_no_applications_label (GtkAppChooserWidget *self) { gchar *text = NULL, *desc = NULL; const gchar *string; - GtkTreeIter iter; if (self->priv->default_text == NULL) { if (self->priv->content_type) desc = g_content_type_get_description (self->priv->content_type); - string = text = g_strdup_printf (_("No applications available to open “%s”"), - desc); + string = text = g_strdup_printf (_("No applications found for “%s”."), desc); g_free (desc); } else @@ -676,11 +677,7 @@ add_no_applications_label (GtkAppChooserWidget *self) string = self->priv->default_text; } - gtk_list_store_append (self->priv->program_list_store, &iter); - gtk_list_store_set (self->priv->program_list_store, &iter, - COLUMN_HEADING_TEXT, string, - COLUMN_HEADING, TRUE, - -1); + gtk_label_set_text (GTK_LABEL (self->priv->no_apps_label), string); g_free (text); } @@ -693,7 +690,8 @@ gtk_app_chooser_widget_select_first (GtkAppChooserWidget *self) GtkTreeModel *model; model = gtk_tree_view_get_model (GTK_TREE_VIEW (self->priv->program_list)); - gtk_tree_model_get_iter_first (model, &iter); + if (!gtk_tree_model_get_iter_first (model, &iter)) + return; while (info == NULL) { @@ -791,7 +789,14 @@ gtk_app_chooser_widget_real_add_items (GtkAppChooserWidget *self) } if (!apps_added) - add_no_applications_label (self); + { + add_no_applications_label (self); + gtk_widget_show (self->priv->no_apps); + } + else + { + gtk_widget_hide (self->priv->no_apps); + } gtk_app_chooser_widget_select_first (self); @@ -1110,6 +1115,8 @@ gtk_app_chooser_widget_class_init (GtkAppChooserWidgetClass *klass) gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserWidget, column); gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserWidget, padding_renderer); gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserWidget, secondary_padding); + gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserWidget, no_apps_label); + gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserWidget, no_apps); gtk_widget_class_bind_template_callback (widget_class, refresh_and_emit_app_selected); gtk_widget_class_bind_template_callback (widget_class, program_list_selection_activated); gtk_widget_class_bind_template_callback (widget_class, widget_button_press_event_cb); diff --git a/gtk/resources/ui/gtkappchooserdialog.ui b/gtk/resources/ui/gtkappchooserdialog.ui index 791379c6ba..07e40bfa20 100644 --- a/gtk/resources/ui/gtkappchooserdialog.ui +++ b/gtk/resources/ui/gtkappchooserdialog.ui @@ -40,7 +40,7 @@ True False - start + center center label True @@ -74,17 +74,20 @@ - - True - False - list-add-symbolic - - Show Other Applications + _View All Application True + True True True - show_more_image + + _Find Applications in Software + True + True + True + True + + diff --git a/gtk/resources/ui/gtkappchooserdialog.ui.h b/gtk/resources/ui/gtkappchooserdialog.ui.h index ee8dd3e857..c0e9306dfa 100644 --- a/gtk/resources/ui/gtkappchooserdialog.ui.h +++ b/gtk/resources/ui/gtkappchooserdialog.ui.h @@ -1,3 +1,4 @@ N_("Select Application"); N_("label"); -N_("Show Other Applications"); +N_("_View All Application"); +N_("_Find Applications in Software "); diff --git a/gtk/resources/ui/gtkappchooserwidget.ui b/gtk/resources/ui/gtkappchooserwidget.ui index 5cf807c3d8..4b236283f6 100644 --- a/gtk/resources/ui/gtkappchooserwidget.ui +++ b/gtk/resources/ui/gtkappchooserwidget.ui @@ -32,64 +32,101 @@ False vertical - - 400 - 300 + True - True - never - in - + + 400 + 300 True True - program_list_sort - False - - - - - browse - - - + never + in - - - - - - - 6 - word - 350 + + True + True + program_list_sort + False + + + + + browse + - - 6 - 7 - - - - - - - - - 1 - - - end + + + + + + + 6 + word + 350 + + + 6 + 7 + + + + + + + + + 1 + + + + + end + + + 3 + + - - 3 - + + + vertical + center + center + + + True + gnome-software-symbolic + 48 + 12 + + + + + + True + No applications found. + center + center + + + + + + + + True diff --git a/gtk/resources/ui/gtkappchooserwidget.ui.h b/gtk/resources/ui/gtkappchooserwidget.ui.h index e69de29bb2..35d9fd31f3 100644 --- a/gtk/resources/ui/gtkappchooserwidget.ui.h +++ b/gtk/resources/ui/gtkappchooserwidget.ui.h @@ -0,0 +1 @@ +N_("No applications found."); -- 2.30.2